package top.xia17.plugins.fast.common.database.dynamic;

import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * ds切换工具
 * 如果不需要动态加载可直接使用 DynamicDataSourceContextHolder
 * @author xia17
 * @date 2021/11/25
 */
@RequiredArgsConstructor
@Slf4j
public class DsSwitch {

    private final DsManager dsManager;

    /**
     * 获得当前线程数据源
     */
    public String peek() {
        return DynamicDataSourceContextHolder.peek();
    }

    /**
     * 获得当前线程数据源
     */
    public DatasourceInfo peekInfo() {
        return dsManager.getInfo(DynamicDataSourceContextHolder.peek());
    }

    /**
     * 设置当前线程数据源
     * <p>
     * 如非必要不要手动调用，调用后确保最终清除
     * </p>
     *
     * @param ds 数据源名称
     */
    public void push(String ds) {
        // 加载数据源
        dsManager.loadOrElseThrow(ds);
        // 切换数据源
        DynamicDataSourceContextHolder.push(ds);
    }

    /**
     * 移除当前线程数据源
     * <p>
     * 如果当前线程是连续切换数据源 只会移除掉当前线程的数据源名称
     * </p>
     */
    public void poll() {
        DynamicDataSourceContextHolder.poll();
    }

    /**
     * 清空当前线程设置的数据源
     */
    public void clear() {
        DynamicDataSourceContextHolder.clear();
    }

}
